home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / + TYLKO W WERSJI CYFROWEJ + / PCWK_PROG / Source / 120 / ukryte3 / fukryte3.cpp next >
C/C++ Source or Header  |  2007-07-05  |  9KB  |  291 lines

  1. //
  2. //  Andrzej Stasiewicz, czerwiec, 2007
  3. //  Ukrywanie obrazu w obrazie
  4. //  Oszacowanie miejsca w tajnym schowku
  5. //  Skonstruowanie nag│≤wka 
  6. //  Wpisanie nag│≤wka i obrazu w m│odsze bity obrazu - no£nika
  7. //
  8. //---------------------------------------------------------------------------
  9. #include <vcl.h>
  10. #pragma hdrstop
  11.  
  12. #include "fukryte3.h"
  13. //---------------------------------------------------------------------------
  14. #pragma package(smart_init)
  15. #pragma resource "*.dfm"
  16. TForm1 *Form1;
  17. //---------------------------------------------------------------------------
  18. __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
  19. {
  20.  il_r = il_g = il_b = 3;            //stan pocz╣tkowy pojemno£ci schowka uzgodniono z edytorkami
  21.  id = 1234;                         //identyfikator te┐ uzgodniono z pocz╣tkowym tekstem w edytorku
  22. }
  23. //---------------------------------------------------------------------------
  24. //  Odczyt pliku, wy£wietlenie z lewej strony, wyr≤wnanie parametr≤w
  25. //  obrazu docelowego, oszacowanie pojemno£ci schowka
  26. void __fastcall TForm1::Button1Click(TObject *Sender)
  27. {
  28.  if( OpenPictureDialog1 -> Execute())
  29.  {
  30.     Image1 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
  31.     Image1 -> Picture -> Bitmap -> PixelFormat = pf32bit;
  32.     Image3 -> Picture -> Bitmap -> PixelFormat = pf32bit;
  33.     int szer = Image1 -> Picture -> Bitmap -> Width;
  34.     int wys  = Image1 -> Picture -> Bitmap -> Height;
  35.     Image3 -> Picture -> Bitmap -> Width = szer;    
  36.     Image3 -> Picture -> Bitmap -> Height = wys;
  37.  
  38.     int rozmiar = szer * wys * ( il_r + il_g + il_b) / 8;
  39.     Label4 -> Caption = "Przestrze± dostΩpna: " + String( rozmiar);
  40.  }    
  41. }
  42. //---------------------------------------------------------------------------
  43. //  Odczyt pliku ukrywanego, wykazanie jego rozmiaru powiΩkszonego o nag│≤wek
  44. //  Uwaga - uwzglΩdniono rozmiar nag│≤wka = 16 + 16 + 16 + 8 + 8 + 8 = 72 bity = 9 bajt≤w
  45. void __fastcall TForm1::Button2Click(TObject *Sender)
  46. {
  47.  if( OpenPictureDialog1 -> Execute())
  48.  {
  49.     Image2 -> Picture -> LoadFromFile( OpenPictureDialog1 -> FileName);
  50.     Image2 -> Picture -> Bitmap -> PixelFormat = pf32bit;
  51.  
  52.     int szer = Image2 -> Picture -> Bitmap -> Width;
  53.     int wys  = Image2 -> Picture -> Bitmap -> Height;
  54.     int rozmiar = szer * wys * 4 + 9;
  55.  
  56.     Label5 -> Caption = "Przestrze± wymagana: " + String( rozmiar);
  57.  }    
  58. }
  59. //---------------------------------------------------------------------------
  60. //  Oszacowanie dostΩpnej przestrzeni
  61. //  Ukrywanie obrazka Image2 w obrazku Image1 
  62. //  i pokazanie wyniku w Image3.
  63. //  Najpierw Image1 jest kopiowany do Image3.
  64. //  Potem okre£lone bity Image3 s╣ modyfikowane.
  65. void __fastcall TForm1::Button3Click(TObject *Sender)
  66. {
  67.  Image3 -> Picture -> Bitmap = Image1 -> Picture -> Bitmap;
  68.  
  69.  int i, j, szer, wys;
  70.  TColor k;
  71.  unsigned char r, g, b;
  72.  
  73.  zapisz_naglowek();             //zapisanie kodu rozpoznawczego, szerokosci, wysokosci i ilosci wykradanych bit≤w
  74.  
  75.  szer = Image2 -> Picture -> Bitmap -> Width;
  76.  wys  = Image2 -> Picture -> Bitmap -> Height;
  77.  for( i = 0; i < szer; ++i)
  78.  {
  79.     for( j = 0; j < wys; ++j)
  80.     {
  81.         k = Image2 -> Picture -> Bitmap -> Canvas -> Pixels[ i][ j];
  82.  
  83.         r = GetRValue( k);
  84.         if( !zapisz_bajt( r))
  85.             return;
  86.             
  87.         g = GetGValue( k);
  88.         if( !zapisz_bajt( g))
  89.             return;
  90.  
  91.         b = GetBValue( k);
  92.         if( !zapisz_bajt( b))
  93.             return;
  94.     }
  95.  }
  96. }
  97. //---------------------------------------------------------------------------
  98. //  Zapis ostatecznego obrazka do pliku
  99. void __fastcall TForm1::Button4Click(TObject *Sender)
  100. {
  101.  if( SavePictureDialog1 -> Execute())
  102.  {
  103.     Image3 -> Picture -> SaveToFile( SavePictureDialog1 -> FileName);
  104.  }    
  105. }
  106. //---------------------------------------------------------------------------
  107. //  Funkcja elementarna.
  108. //  oddaj stan 0, 1, zgodnie z bitem poz w bajcie bajt
  109. int TForm1 :: daj_bit( unsigned char bajt, int poz)
  110. {
  111.  int bit;
  112.  unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128};   //binarnie: '1', '10', '100', '1000', ...
  113.  
  114.  if( bajt & maska[ poz])
  115.     bit = 1;
  116.  else
  117.     bit = 0;
  118.  return bit;
  119. }
  120. //---------------------------------------------------------------------------
  121. //  Funkcja elementarna.
  122. //  W bajcie 'bajt' nadaj bitowi 'poz' wartosc 'bit'
  123. unsigned char TForm1 :: ustaw_bit( unsigned char bajt, int poz, int bit)
  124. {
  125.  unsigned char maska[ 8] = {1, 2, 4, 8, 16, 32, 64, 128};   //'1', '10', '100', '1000', ...
  126.  
  127.  if( bit == 1)          //wpisywanie jedynki
  128.  {
  129.     bajt = bajt | maska[ poz];
  130.  }
  131.  else
  132.  {
  133.     bajt = bajt & (~maska[ poz]);
  134.  }
  135.  return bajt;
  136. }
  137. //---------------------------------------------------------------------------
  138. //  Zapisz wartosc bit (=0, 1) w bie┐╣cym bicie obrazka g│≤wnego Image3
  139. //  (kt≤ry jest kopi╣ Image1)
  140. //  Dokonaj przesuniΩcia wskaƒnik≤w pozycji bie┐╣cego bitu w Image3
  141. //  return: true - zapisano, 
  142. //          false - koniec obrazka g│≤wnego.
  143. bool TForm1 :: zapisz_bit( int bit)
  144. {
  145.  int szer = Image3 -> Picture -> Bitmap -> Width;
  146.  int wys  = Image3 -> Picture -> Bitmap -> Height;
  147.  
  148.  if( Y_POZ > wys)
  149.     return false;                       //koniec przestrzeni do zapisu
  150.    
  151.  TColor k = Image3 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ];
  152.  unsigned char r = GetRValue( k);
  153.  unsigned char g = GetGValue( k);
  154.  unsigned char b = GetBValue( k);
  155.  
  156.  switch( RGB_POZ)
  157.  {
  158.   case 0:
  159.             r = ustaw_bit( r, BIT_POZ, bit);
  160.             break;
  161.   case 1:
  162.             g = ustaw_bit( g, BIT_POZ, bit);
  163.             break;
  164.   case 2:
  165.             b = ustaw_bit( b, BIT_POZ, bit);
  166.             break;
  167.  }
  168.  k = RGB( r, g, b);
  169.  Image3 -> Picture -> Bitmap -> Canvas -> Pixels[ X_POZ][ Y_POZ] = k;
  170.  
  171.  BIT_POZ ++;                        //nastΩpny wskaƒniki na nastΩpny bit ...
  172.  
  173.  if( RGB_POZ == 0)                  //... ale czy mie£ci siΩ w kanale R?
  174.  {
  175.     if( BIT_POZ >= il_r)
  176.     {
  177.         BIT_POZ = 0;
  178.         RGB_POZ = 1;                //... je£li nie, przejdƒmy do kana│u G...
  179.     }
  180.  }
  181.  
  182.  if( RGB_POZ == 1)                  //... ale czy mie£ci siΩ w kanale G? ...
  183.  {
  184.     if( BIT_POZ >= il_g)
  185.     {
  186.         BIT_POZ = 0;
  187.         RGB_POZ = 2;                //... je£li nie, przejdƒmy do kana│u B ...
  188.     }
  189.  }
  190.  
  191.  if( RGB_POZ == 2)                  //... ale czy mie£ci siΩ w kanale B? ...
  192.  {
  193.     if( BIT_POZ >= il_b)
  194.     {
  195.         BIT_POZ = 0;
  196.         RGB_POZ = 0; 
  197.         X_POZ ++;                   //... je£li nie, przejdƒmy do nastΩpnego piksela
  198.         if( X_POZ >= szer)
  199.         {
  200.             X_POZ = 0;
  201.             Y_POZ ++;
  202.         }
  203.     }
  204.  }
  205.  return true;
  206. }
  207. //---------------------------------------------------------------------------
  208. //  8-krotne wywo│anie powy┐szej zapisz_bit()
  209. bool TForm1 :: zapisz_bajt( unsigned char bajt)
  210. {
  211.  int i, bit;
  212.  for( i = 0; i < 8; ++i)
  213.  {
  214.     bit = daj_bit( bajt, i);
  215.     if( !zapisz_bit( bit))
  216.         return false;
  217.  }
  218.  return true;
  219. }
  220. //---------------------------------------------------------------------------
  221. //  Zapisanie kodu rozpoznawczego, szerokosci, wysokosci i ilosci wykradanych bit≤w
  222. //  Uwaga - nag│≤wek jest zapisywany zawsze na 2 bitach w kana│ach R, G, B
  223. //  Z tego powodu na moment zmieniamy stany il_r, il_g, il_b na 2
  224. bool TForm1 :: zapisz_naglowek( void)
  225. {
  226.  X_POZ = 0;                     //start
  227.  Y_POZ = 0;
  228.  RGB_POZ = 0;
  229.  BIT_POZ = 0;
  230.  
  231.  int szer = Image2 -> Picture -> Bitmap -> Width;
  232.  int wys  = Image2 -> Picture -> Bitmap -> Height;
  233.  
  234.  unsigned char id_hi = id >> 8;          //bajty do zapisu
  235.  unsigned char id_lo = id;
  236.  unsigned char szer_hi = szer >> 8;
  237.  unsigned char szer_lo = szer;
  238.  unsigned char wys_hi = wys >> 8;
  239.  unsigned char wys_lo = wys;
  240.  unsigned char il_ra = il_r;
  241.  unsigned char il_ga = il_g;
  242.  unsigned char il_ba = il_b;
  243.  
  244.  il_r = il_g = il_b = 2;                //umowa - nag│≤wek wykrada ZAWSZE po 2 bity
  245.  
  246.  if( !zapisz_bajt( id_hi))
  247.     return false;
  248.  if( !zapisz_bajt( id_lo))
  249.     return false;
  250.  
  251.  if( !zapisz_bajt( szer_hi))
  252.     return false;
  253.  if( !zapisz_bajt( szer_lo))
  254.     return false;
  255.  
  256.  if( !zapisz_bajt( wys_hi))
  257.     return false;
  258.  if( !zapisz_bajt( wys_lo))
  259.     return false;
  260.  
  261.  if( !zapisz_bajt( il_ra))
  262.     return false;
  263.  if( !zapisz_bajt( il_ga))
  264.     return false;
  265.  if( !zapisz_bajt( il_ba))
  266.     return false;
  267.  
  268.  il_r = il_ra;
  269.  il_g = il_ga;
  270.  il_b = il_ba;                //koniec umowy - wracamy do ustawie± u┐ytkownika
  271.  
  272.  return true;
  273. }
  274. //---------------------------------------------------------------------------
  275. //  Zmieniono nastawy edytork≤w - identyfikatora i rozmiar≤w schowka
  276. void __fastcall TForm1::Edit3Exit(TObject *Sender)
  277. {
  278.  il_r = Edit1 -> Text.ToInt(),
  279.  il_g = Edit2 -> Text.ToInt(),
  280.  il_b = Edit3 -> Text.ToInt();
  281.  id = Edit4 -> Text.ToInt();
  282.  
  283.  int szer = Image1 -> Picture -> Bitmap -> Width;
  284.  int wys  = Image1 -> Picture -> Bitmap -> Height;
  285.  int rozmiar = szer * wys * ( il_r + il_g + il_b) / 8;
  286.  
  287.  Label4 -> Caption = "Przestrze± dostΩpna: " + String( rozmiar);
  288. }
  289. //---------------------------------------------------------------------------
  290.  
  291.